/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.optimus.web.mbean;

import com.optimus.app.Application;
import com.optimus.app.ThreadWorkerRutaOptima;
import com.optimus.common.cvo.CampanaVOList;
import com.optimus.common.cvo.ElementoPublicitarioCVO;
import com.optimus.common.cvo.ElementoPublicitarioCVOList;
import com.optimus.common.cvo.MapaCVO;
import com.optimus.common.cvo.MapaCVOList;
import com.optimus.common.cvo.MercadoVOList;
import com.optimus.common.util.ApplicationException;
import com.optimus.common.util.Constants;
import com.optimus.common.vo.CampanaVO;
import com.optimus.common.vo.MapaVO;
import com.optimus.common.vo.ResultadoVO;
import com.optimus.common.vo.MercadoVO;
import com.optimus.facade.PlaneamientoFacade;
import com.optimus.facade.impl.PlaneamientoFacadeImpl;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.servlet.http.HttpServletRequest;
import org.primefaces.event.SelectEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 *
 * @author victor
 */
@ManagedBean(name="OptimusBean")
@ViewScoped
public class OptimusBean implements Serializable {
    private static Logger logger = LoggerFactory.getLogger(OptimusBean.class);

    private Integer mercadoSeleccionado;
    private List<MercadoVO> mercados;

    private Integer campanaSeleccionada;
    private List<CampanaVO> campanas;

    private List<ElementoPublicitarioCVO> lstElementoPublicitario;

    private List<MapaCVO> lstMapaCVO;

    private boolean habilitarCampana=false;

    static PlaneamientoFacade planeamientoFacade=new PlaneamientoFacadeImpl();

    public boolean isHabilitarCampana() {
        return habilitarCampana;
    }

    public void setHabilitarCampana(boolean habilitarCampana) {
        this.habilitarCampana = habilitarCampana;
    }

    public OptimusBean(){
        Long tk =Application.getTicket();
        try {
            mercadoSeleccionado = 0;
            campanaSeleccionada = 0;
            MercadoVO mercadoVO = new MercadoVO();
            mercadoVO.setTicket(tk);
            MercadoVOList zonaList = planeamientoFacade.listarMercado(mercadoVO);
            mercados = zonaList.getLista();

            CampanaVO campanaVO = new CampanaVO();
            campanaVO.setTicket(tk);
            CampanaVOList campanaList = planeamientoFacade.listarCampana(campanaVO);
            campanas= campanaList.getLista();

            cargarElementoPublicitario(tk);

            MapaVO vmvo= new MapaVO();
            vmvo.setTicket(tk);
            MapaCVOList mapaCVOList=planeamientoFacade.listarMapa(vmvo);
            lstMapaCVO=mapaCVOList.getLista();
            
        } catch (ApplicationException ex) {
            logger.debug("Error al inicializar Bean [ticket] "+ tk, ex);
        }
    }

    public void onRowSelect(SelectEvent event){
        MapaCVO mapaActual = (MapaCVO)event.getObject();
    }

    public void seleccionarMercado(AjaxBehaviorEvent  ev){
        Long tk = Application.getTicket();
        cargarElementoPublicitario(tk);
    }
    public void seleccionarCampana(AjaxBehaviorEvent  ev){
        Long tk = Application.getTicket();
        /*if(habilitarCampana){
            if(campanaSeleccionada==null||campanaSeleccionada.intValue()==0){
                mensaje(null,"Seleccione una campana",tk);
                return;
            }
        }else{
            campanaSeleccionada=0;
        }*/
        if(habilitarCampana){
            cargarElementoPublicitario(tk);
        }
    }

    public void mostrarMapas(ActionEvent actionEvent){
        Long tk = Application.getTicket();
        try {
            MapaVO vmvo = new MapaVO();
            vmvo.setTicket(tk);
            vmvo.setIdCampanaRecoleccion(campanaSeleccionada);
            MapaCVOList mapaCVOList = planeamientoFacade.listarMapa(vmvo);
            if(lstMapaCVO!=null &&  !lstMapaCVO.isEmpty())
            lstMapaCVO.clear();
            
            lstMapaCVO = mapaCVOList.getLista();
        } catch (ApplicationException ex) {
            mensaje("Error","Error al intentar recuperar los datos",tk);
            logger.debug("Error al intentar recuperar los datos", ex);
        }
        
    }
    public void generarRutaOptima(ActionEvent actionEvent){
        try {
            Long tk = Application.getTicket();
            ElementoPublicitarioCVOList epvo = new ElementoPublicitarioCVOList();
            epvo.setTicket(tk);
            epvo.setLista(lstElementoPublicitario);
            CampanaVO campanaVO = new CampanaVO();
            campanaVO.setTicket(tk);
            if(campanaSeleccionada==null||campanaSeleccionada.intValue()==0){
                mensaje(null,"Debe seleccionar una campana",tk);
                return;
            }
            if(mercadoSeleccionado==null|| mercadoSeleccionado.intValue()==0){
                mensaje(null,"Debe seleccionar un mercado",tk);
                return;
            }
            //Integer campanaSeleccionadaVal = Integer.valueOf(campanaSeleccionada);
            campanaVO.setIdCampanaRecoleccion(campanaSeleccionada);
            if( ThreadWorkerRutaOptima.instance().getEstaEjecutando()){
                mensaje("Informacion","Proceso de generacion de ruta optima esta ejecutandose espere por favor",tk);
                return;
            }
            HashMap<String,Object> parametros = new HashMap<String, Object>();
            parametros.put("idCampanaRecoleccion",campanaSeleccionada);
            parametros.put("idMercado",mercadoSeleccionado);
            parametros.put("ticket",tk);
            parametros.put("datos",epvo);
            ThreadWorkerRutaOptima.instance().setParametros(parametros);
            ThreadWorkerRutaOptima.instance().ejecutar();
            //ResultadoVO resultadoVO=planeamientoFacade.generarRutaOptima(epvo,campanaVO);
            //if(resultadoVO.getCodigo()>0){
            //    mensaje("Informacion","Revise por favor, los pudieron no haber sido guardados",tk);
            //}else {
            //    mensaje(null,"Se genero ruta optima",tk);
            //}
            
        } catch (Exception e) {
            logger.debug("Error al guardar los datos", e);
        }
    }
    public String verMapa(){
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest myRequest = (HttpServletRequest)context.getExternalContext().getRequest();
        //HttpSession mySession = myRequest.getSession();
        String idMapa=myRequest.getParameter("id-mapa");
        logger.debug("codigo de mapa clickeado: " + idMapa);
        return "mostrar-mapa";
    }
    public String verPuntosMapa(){
        Long tk= Application.getTicket();
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest myRequest = (HttpServletRequest)context.getExternalContext().getRequest();
        //HttpSession mySession = myRequest.getSession();
        String idMapa=myRequest.getParameter("id-mapa");
        myRequest.setAttribute(Constants.TICKET, tk);
        logger.debug("ticket = {}, idMapa={} ", new Object[]{tk,idMapa} );
        return "puntos-mapa";
    }

    public void generarMapas(ActionEvent actionEvent){
        try {
            Long tk = Application.getTicket();
            if(campanaSeleccionada==null||campanaSeleccionada.intValue()==0){
                mensaje(null,"Seleccione una campana",tk);
                return;
            }
            CampanaVO campanaVO = new CampanaVO();
            campanaVO.setTicket(tk);
            //Integer campanaSeleccionadaVal = Integer.valueOf(campanaSeleccionada);
            campanaVO.setIdCampanaRecoleccion(campanaSeleccionada);
            ResultadoVO resultadoVO=planeamientoFacade.generarMapas(campanaVO);
            if(resultadoVO.getCodigo()>0){
                mensaje(null,"Revise por favor, los datos pudieron no haber sido guardados",tk);
            }else {
                mensaje(null,"Se genero mapas",tk);
            }
            MapaVO vmvo= new MapaVO();
            vmvo.setTicket(tk);
            MapaCVOList mapaCVOList=planeamientoFacade.listarMapa(vmvo);
            lstMapaCVO=mapaCVOList.getLista();
        } catch (Exception e) {
            logger.debug("Error al guardar los datos", e);
        }
    }

    public void guardarMapas(ActionEvent actionEvent){

    }

    void cargarElementoPublicitario(Long tk){
        try {
            ElementoPublicitarioCVO epvo = new ElementoPublicitarioCVO();
            epvo.setTicket(tk);
            //Integer campanaSeleccionadaVal = Integer.valueOf(campanaSeleccionada);
            //Integer mercadoSeleccionadoVal = Integer.valueOf(mercadoSeleccionado);
            if(habilitarCampana){
                epvo.setIdCampanaRecoleccion(campanaSeleccionada);
            }else{
                epvo.setIdCampanaRecoleccion(0);
            }
            epvo.setIdMercado(mercadoSeleccionado);
            ElementoPublicitarioCVOList epvol = planeamientoFacade.listarEPMercadoCampana(epvo);
            lstElementoPublicitario = epvol.getLista();
        } catch (ApplicationException ex) {
            logger.debug("Error al recuperar los datos", ex);
        }

    }
    public Integer getCampanaSeleccionada() {
        return campanaSeleccionada;
    }

    public void setCampanaSeleccionada(Integer campanaSeleccionada) {
        this.campanaSeleccionada = campanaSeleccionada;
    }

    public List<CampanaVO> getCampanas() {
        return campanas;
    }

    public void setCampanas(List<CampanaVO> campanas) {
        this.campanas = campanas;
    }

    public List<ElementoPublicitarioCVO> getLstElementoPublicitario() {
        return lstElementoPublicitario;
    }

    public void setLstElementoPublicitario(List<ElementoPublicitarioCVO> lstElementoPublicitario) {
        this.lstElementoPublicitario = lstElementoPublicitario;
    }

    public List<MapaCVO> getLstMapaCVO() {
        return lstMapaCVO;
    }

    public void setLstMapaCVO(List<MapaCVO> lstMapaCVO) {
        this.lstMapaCVO = lstMapaCVO;
    }

    public Integer getMercadoSeleccionado() {
        return mercadoSeleccionado;
    }

    public void setMercadoSeleccionado(Integer mercadoSeleccionado) {
        this.mercadoSeleccionado = mercadoSeleccionado;
    }

    public List<MercadoVO> getMercados() {
        return mercados;
    }

    public void setMercados(List<MercadoVO> mercados) {
        this.mercados = mercados;
    }

    public void mensaje(String titulo,String mensaje,Long ticket){
        try {
            if(titulo==null){
                titulo="Successful";
            }
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(titulo, mensaje));
        } catch (Exception ex) {
            logger.info("No se puede mostrar mensaje [TICKET] "+ticket, ex);
        }
    }

}
